#ifndef __ASSGL__H__
#define __ASSGL__H__

#if 0
// GLEW
#define GLEW_STATIC
#include <GL/glew.h>
#include <GL/freeglut.h> // 包含OpenGL头文件
// GLFW
#include <GLFW/glfw3.h>
// FreeType
//字体库头文件
#include <ft2build.h>
#include <freetype/config/ftheader.h>
#include <freetype/ftglyph.h>
#include FT_FREETYPE_H

#endif

#include "glcontext.h"
#include "gltxt.h"
#include "overlayobj.h"



#include <FreeImage.h>

#include <stdbool.h>


#ifdef __cplusplus
extern "C" {
#endif

#ifdef __cplusplus 
#define EXTERN_C extern "C"
#else
#define EXTERN_C
#endif

#include <libavutil/frame.h>
// #include <libswresample/swresample.h>
#include <libswscale/swscale.h>
#include <libavformat/avformat.h>
// #include <libavformat/avio.h>
#include <libavutil/imgutils.h>
#include <libavutil/pixfmt.h>

#define K1CONST				1024
#define COMMONCOUNTS  		50         //通用文字数量
#define TRACKCOUNTS         500        //轨道数量
#define LINESUBTITLECOUNTS  50         //轨道上单行文字数量
#define FONTNAMECOUNTS		50         //字体名称文字数量
#define FONTOBJCOUNTS		50         //字体对象实例数量

typedef struct assglImage {
    int w, h;                   // Bitmap width/height
    int stride;                 // Bitmap stride
    unsigned char *bitmap;      // 1bpp stride*h alpha buffer
                                // Note: the last row may not be padded to
                                // bitmap stride!
    uint32_t color;             // Bitmap color and alpha, RGBA
    int dst_x, dst_y;           // Bitmap placement inside the video frame

    struct assglImage *next;   // Next image, or NULL

    enum {
        IMAGE_TYPE_CHARACTER,
        IMAGE_TYPE_OUTLINE,
        IMAGE_TYPE_SHADOW
    } type;

} AssglImage;

typedef struct glParam{
	int glTxtNum;
	PGlContext context;
	POverlayobj obj;
	PGLText gltxt[FONTOBJCOUNTS];
}GlParam;

typedef struct glPictureParam{
	long BufferSize;
	char * Buffer;
}GlPictureParam;

typedef struct assgl
{
	int TrackId;							//轨道id
	char FontName[FONTNAMECOUNTS];			//字体名称
	int FontSize;							//字体大小
	char FontColour[COMMONCOUNTS];			//字体颜色
	int Outline;							//外框宽度
	char OutlineColour[COMMONCOUNTS];		//外边框颜色
	char BackColour[COMMONCOUNTS];			//背景颜色
	bool Bold;								//粗体
	bool Italic;							//斜体
	bool Underline;							//下划线
	bool StrikeOut;							//删除线
	int Spacing;							//字间距
	int Shadow;								//阴影
	int MarginL;							//左对齐
	int MarginR;							//右对齐
	int MarginV;							//居中对齐
	char Start[COMMONCOUNTS];				//开始时间 字符串表示
	long long StartTime;					//ms 开始时间
	long long Duration;						//ms 持续时间
	char End[COMMONCOUNTS];					//结束时间 字符串表示
	
	char FigureStyle[COMMONCOUNTS];			//花字样式字符串
	char EffectStyle[COMMONCOUNTS];			//动画样式字符串
	int ScaleX;								//缩放x
	int ScaleY;								//缩放y
	int PosX;								//该字段暂时不启用
	int PosY;								//该字段暂时不启用
	int Layer;								//轨道层级
	char Text[LINESUBTITLECOUNTS];

	// GlTextParam GlTextParamS;
	
}AssglTrack;

typedef enum {
    PST_UNKNOWN = 0,
    PST_INFO,
    PST_STYLES,
    PST_EVENTS,
    PST_FONTS
} ParserState;

typedef struct assglLib 
{
	int PlayResX;								//屏幕大小
	int PlayResY;								//屏幕大小
	int AssglTrackCounts;						//轨道数量
	int PixFmt;
	GlParam	GlParamS;
	ParserState State;
	char EventFormat[K1CONST];
	AssglImage *AImage;						//该字段暂时不启用
	// char* buff;								//存放图像数据
	GlPictureParam PicBuff;					//存放图像数据
	AssglTrack AssglTrackItem[TRACKCOUNTS];	//轨道数据
}AssglLib;

// std::vector<AssglTrack> AssglVec;

/**
 * @brief 返回版本字符串，该函数同时使用来做libassgl库检测的
 * 
 * @return EXTERN_C* 
 */
EXTERN_C char* assglGetVersion(); 

/**
 * @brief 一般初始化时调用，只调用一次
 * 
 * @param assFilename ass文件名称
 * @return EXTERN_C AssglLib* 
 */
EXTERN_C AssglLib* assgl_read_file(const char* assFilename);

/**
 * @brief 初始化opengl 一般初始化时调用，只调用一次
 * 
 * @param width 
 * @param height 
 * @param glparam 
 * @return EXTERN_C 
 */
EXTERN_C void assglWindowInit(int width, int height,GlParam *glparam);

/**
 * @brief 实现渲染逻辑
 * 
 * @param assglLib 上下文
 * @param timeMs 时间戳
 * @param picref 当前帧帧数据
 * @param out 返回下一帧帧数据，在外部申请了空间，复制了参数
 * @return EXTERN_C* 返回渲染后的帧数据
 */
EXTERN_C AVFrame * assglReaderToFrame(AssglLib *assglLib,double timeMs,AVFrame *picref,AVFrame *out);

#ifdef __cplusplus
}
#endif

#endif  //!__ASSGL__H__
